package com.zghhost.codedemo.jinzhi;


/**
 * @author guohua.zhang@zhaopin.com.cn
 * @Date 2019/1/14 14:28
 */
public class LaoshuHeyao {
    /**
     * 有 1000 个一模一样的瓶子，其中有 999 瓶是普通的水，有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。
     * 现在，你只有 10 只小白鼠和一星期的时间，如何检验出哪个瓶子里有毒药？
     */

    /**
     * 这个问题的答案也堪称经典：把瓶子从 0 到 999 依次编号，然后全部转换为 10 位二进制数。让第一只老鼠喝掉所有二进制数右起第一位是 1 的瓶子，
     * 让第二只老鼠喝掉所有二进制数右起第二位是 1 的瓶子，等等。一星期后，如果第一只老鼠死了，就知道毒药瓶子的二进制编号中，右起第一位是 1 ；
     * 如果第二只老鼠没死，就知道毒药瓶子的二进制编号中，右起第二位是 0 ⋯⋯每只老鼠的死活都能确定出 10 位二进制数的其中一位，由此便可知道毒药瓶子的编号了。
     * 现在，有意思的问题来了：如果你有两个星期的时间（换句话说你可以做两轮实验），为了从 1000 个瓶子中找出毒药，你最少需要几只老鼠？注意，
     * 在第一轮实验中死掉的老鼠，就无法继续参与第二次实验了。
     * 答案：7 只老鼠就足够了。事实上，7 只老鼠足以从 37 = 2187 个瓶子中找出毒药来。首先，把所有瓶子从 0 到 2186 编号，然后全部转换为 7
     * 位三进制数。现在，让第一只老鼠喝掉所有三进制数右起第一位是 2 的瓶子，让第二只老鼠喝掉所有三进制数右起第二位是 2 的瓶子，等等。一星期之后，
     * 如果第一只老鼠死了，就知道毒药瓶子的三进制编号中，右起第一位是 2 ；如果第二只老鼠没死，就知道毒药瓶子的三进制编号中，右起第二位不是 2，
     * 只可能是 0 或者 1 ⋯⋯也就是说，每只死掉的老鼠都用自己的生命确定出了，三进制编号中自己负责的那一位是 2 ；但每只活着的老鼠都只能确定，
     * 它所负责的那一位不是 2 。于是，问题就归约到了只剩一个星期时的情况。在第二轮实验里，让每只活着的老鼠继续自己未完成的任务，喝掉它负责的那一位是 1
     * 的所有瓶子。再过一星期，毒药瓶子的三进制编号便能全部揭晓了。
     * 类似地，我们可以证明， n 只小白鼠 t 周的时间可以从 (t+1)n 个瓶子中检验出毒药来。
     * @param args
     */
    public static void main(String[] args){
        System.out.println(Double.valueOf(Math.pow(2,12)-1).longValue());
        System.out.println(Long.parseLong("111111111111",2));
//        System.out.println(Math.pow(27, 1/3));
//        for(long i=9,ic=1000000;i<=ic;i*=10){
//            System.out.print(i+"(");
//            for(int j=Character.MIN_RADIX;j<=Character.MAX_RADIX;j++){
//                System.out.print(Long.toString(i,j)+" ");
//            }
//            System.out.print(")");
//            System.out.println();
//        }
        for(long i=0,ic=1000;i<ic;i++){
//            System.out.println(String.format("%010d",Long.valueOf(Long.toBinaryString(i))));
//            System.out.println(Long.valueOf(Long.toString(i,3)));
        }
    }
}
